<?php
namespace lib;

class PHPPage
{
    public function __construct($pageArr){
        $this->total = $pageArr['total_count'];
        $this->lastPage = $pageArr['last_page'];
        $this->currentPage = $pageArr['current_page'];
        $this->hasMore     = $this->currentPage < $this->lastPage;
    }
    /**
     * 上一页按钮
     * @param string $text
     * @return string
     */
    protected function getPreviousButton($text = "&laquo;")
    {

        if ($this->currentPage <= 1) {
            return $this->getDisabledTextWrapper($text);
        }

        $url = $this->url(
            $this->currentPage - 1
        );

        return $this->getPageLinkWrapper($url, $text);
    }

    /**
     * 下一页按钮
     * @param string $text
     * @return string
     */
    protected function getNextButton($text = '&raquo;')
    {
        if (!$this->hasMore) {
            return $this->getDisabledTextWrapper($text);
        }

        $url = $this->url($this->currentPage + 1);

        return $this->getPageLinkWrapper($url, $text);
    }

    /**
     * 页码按钮
     * @return string
     */
    protected function getLinks()
    {
        if ($this->simple)
            return '';

        $block = [
            'first'  => null,
            'slider' => null,
            'last'   => null
        ];

        $side   = 3;
        $window = $side * 2;

        if ($this->lastPage < $window + 6) {
            $block['first'] = $this->getUrlRange(1, $this->lastPage);
        } elseif ($this->currentPage <= $window) {
            $block['first'] = $this->getUrlRange(1, $window + 2);
            $block['last']  = $this->getUrlRange($this->lastPage - 1, $this->lastPage);
        } elseif ($this->currentPage > ($this->lastPage - $window)) {
            $block['first'] = $this->getUrlRange(1, 2);
            $block['last']  = $this->getUrlRange($this->lastPage - ($window + 2), $this->lastPage);
        } else {
            $block['first']  = $this->getUrlRange(1, 2);
            $block['slider'] = $this->getUrlRange($this->currentPage - $side, $this->currentPage + $side);
            $block['last']   = $this->getUrlRange($this->lastPage - 1, $this->lastPage);
        }

        $html = '';

        if (is_array($block['first'])) {
            $html .= $this->getUrlLinks($block['first']);
        }

        if (is_array($block['slider'])) {
            $html .= $this->getDots();
            $html .= $this->getUrlLinks($block['slider']);
        }

        if (is_array($block['last'])) {
            $html .= $this->getDots();
            $html .= $this->getUrlLinks($block['last']);
        }

        return $html;
    }

    /**
     * 渲染分页html
     * @return mixed
     */
    public function render()
    {
        
        return sprintf(
            '<ul class="pagination">%s %s %s</ul>',
            $this->getPreviousButton(),
            $this->getLinks(),
            $this->getNextButton()
        );
    }

    /**
     * 生成一个可点击的按钮
     *
     * @param  string $url
     * @param  int    $page
     * @return string
     */
    protected function getAvailablePageWrapper($url, $page)
    {
        return '<li><a href="' . htmlentities($url) . '">' . $page . '</a></li>';
    }

    /**
     * 生成一个禁用的按钮
     *
     * @param  string $text
     * @return string
     */
    protected function getDisabledTextWrapper($text)
    {
        return '<li class="disabled"><span>' . $text . '</span></li>';
    }

    /**
     * 生成一个激活的按钮
     *
     * @param  string $text
     * @return string
     */
    protected function getActivePageWrapper($text)
    {
        return '<li class="active"><span>' . $text . '</span></li>';
    }

    /**
     * 生成省略号按钮
     *
     * @return string
     */
    protected function getDots()
    {
        return $this->getDisabledTextWrapper('...');
    }

    /**
     * 批量生成页码按钮.
     *
     * @param  array $urls
     * @return string
     */
    protected function getUrlLinks(array $urls)
    {
        $html = '';

        foreach ($urls as $page => $url) {
            $html .= $this->getPageLinkWrapper($url, $page);
        }

        return $html;
    }

    /**
     * 生成普通页码按钮
     *
     * @param  string $url
     * @param  int    $page
     * @return string
     */
    protected function getPageLinkWrapper($url, $page)
    {
        if ($page == $this->currentPage) {
            return $this->getActivePageWrapper($page);
        }

        return $this->getAvailablePageWrapper($url, $page);
    }













    //分页
    public static function pageTable($pageArr,$tag='',$ps='page')
    {
        $pageUrl=$_SERVER["QUERY_STRING"];

        $html='<table border="0" cellspacing="0" cellpadding="0">';
        $html.='<tr><td>';
        $html.='<span>共'.$this->total_count.'条 第'.$this->current_page.'/'.$this->total_page.'页</span>';
        if($this->total_page < 6){
            foreach ($this->all_pages as $val) {
                if($this->current_page == $val){
                    $html.='<i>'.$val.'</i>';
                }else{
                    $html.='<a href="'.$this->pageUrl($pageUrl,$val).'">'.$val.'</a>';
                }
            }
        }else{

        }

        $i = $this->current_page - 1;
        if($this->total_page < 6 || $this->current_page < 6){
            for($i=1;$i<=$this->total_page&&$i<=6;$i++) {
                if($this->current_page == $i){
                    $html.='<i>'.$i.'</i>';
                }else{
                    $html.='<a href="'.$this->url_set_value($pageurl,$i).'">'.$i.'</a>';
                }
            }
            if($this->total_page > 6){
                if($this->total_page > $this->current_page){
                    $html.='<span>...</span><a href="'.$this->url_set_value($pageurl,$this->total_page).'">'.$this->total_page.'</a>';
                }else{
                    $html.='';
                }
            }
        }else{
            $html.='<a href="'.$this->url_set_value($pageurl,1).'">1</a><span>...</span>';
            for($i=2;$i>0;$i--){
                $html.='<a href="'.$this->url_set_value($pageurl,$this->current_page-$i).'">'.(int)($this->current_page-$i).'</a>';
            }
            $html.='<i>'.$this->current_page.'</i>';
            $ii=$this->current_page;
            $ii++;
            for($i=1;$ii<=$this->total_page;$i++,$ii++) {
                if($i>2)break;
                $pStr.='<a href="'.url_set_value($pageurl,$ii).'">'.$ii.'</a>';
            }
            if($this->total_page==$ii) {
                $pStr.='<a href="'.$this->url_set_value($pageurl,$this->total_page).'">'.$this->total_page.'</a>';
            }else if($this->total_page-$p>2){$pStr.='<span>...</span><a href="'.$this->url_set_value($pageurl,$this->total_page).'">'.$this->total_page.'</a>';}
        }


        $ps='page';
        $p=$pagearr['current_page']; //当前页
        $allNum=$pagearr['total_count']; //总数
        $allPage=$pagearr['total_page']; //总页数
        // $tag && $tag='&'.$this->pfit($tag);
        // '.url_set_value($pageurl,$ps,$pagearr['next_page']).'
        $pageurl=$_SERVER["QUERY_STRING"];

        $pStr='<table border="0" cellspacing="0" cellpadding="0"><tr><td>';
        $pStr.='<span>共'.$allNum.'条 第'.$p.'/'.$allPage.'页</span>';
        $i=$p-1;
        if($allPage<6||$p<6){
            for($i=1;$i<=$allPage&&$i<=6;$i++) {
                $pStr.=($i==$p)?'<i>'.$i.'</i>':'<a href="'.url_set_value($pageurl,$i).'">'.$i.'</a>';
            }
            if($allPage>6){
                $pStr.=($p<$allPage)?'<span>...</span><a href="'.url_set_value($pageurl,$allPage).'">'.$allPage.'</a>':'';
            }
        }
        else {
            $pStr.='<a href="'.url_set_value($pageurl,$ps,1).'">1</a><span>...</span>';
            for($i=2;$i>0;$i--){$pStr.='<a href="'.url_set_value($pageurl,$p-$i).'">'.(int)($p-$i).'</a>';}
            $pStr.='<i>'.$p.'</i>';
            $ii=$p;$ii++;
            for($i=1;$ii<=$allPage;$i++,$ii++) {if($i>2)break;$pStr.='<a href="'.url_set_value($pageurl,$ii).'">'.$ii.'</a>';}
            if($allPage==$ii) {$pStr.='<a href="'.url_set_value($pageurl,$allPage).'">'.$allPage.'</a>';}
            else if($allPage-$p>2){$pStr.='<span>...</span><a href="'.url_set_value($pageurl,$allPage).'">'.$allPage.'</a>';}
        }
        $pStr.='</td></tr></table>';
        return $pStr;
    }



    //分页
    public static function pageTable2($pageArr,$tag='',$ps='page'){
        
        // $this->page_num=$pagearr['total_page']; 
        // $pcur_start=$this->pabs($this->page_num,$this->page_cur,$this->single_num);
        // $this->start=$pcur_start['start'];
        
        $ps='page';
        $p=$pagearr['current_page']; //当前页
        $allNum=$pagearr['total_count']; //总数
        $allPage=$pagearr['total_page']; //总页数
        // $tag && $tag='&'.$this->pfit($tag);
        // '.url_set_value($pageurl,$ps,$pagearr['next_page']).'
        $pageurl=$_SERVER["QUERY_STRING"];

        $pStr='<table border="0" cellspacing="0" cellpadding="0"><tr><td>';
        $pStr.='<span>共'.$allNum.'条 第'.$p.'/'.$allPage.'页</span>';
        $i=$p-1;
        if($allPage<6||$p<6){
            for($i=1;$i<=$allPage&&$i<=6;$i++) {
                $pStr.=($i==$p)?'<i>'.$i.'</i>':'<a href="'.url_set_value($pageurl,$ps,$i).'">'.$i.'</a>';
            }
            if($allPage>6){
                $pStr.=($p<$allPage)?'<span>...</span><a href="'.url_set_value($pageurl,$ps,$allPage).'">'.$allPage.'</a>':'';
            }
        }
        else {
            $pStr.='<a href="'.url_set_value($pageurl,$ps,1).'">1</a><span>...</span>';
            for($i=2;$i>0;$i--){$pStr.='<a href="'.url_set_value($pageurl,$ps,$p-$i).'">'.(int)($p-$i).'</a>';}
            $pStr.='<i>'.$p.'</i>';
            $ii=$p;$ii++;
            for($i=1;$ii<=$allPage;$i++,$ii++) {if($i>2)break;$pStr.='<a href="'.url_set_value($pageurl,$ps,$ii).'">'.$ii.'</a>';}
            if($allPage==$ii) {$pStr.='<a href="'.url_set_value($pageurl,$ps,$allPage).'">'.$allPage.'</a>';}
            else if($allPage-$p>2){$pStr.='<span>...</span><a href="'.url_set_value($pageurl,$ps,$allPage).'">'.$allPage.'</a>';}
        }
        $pStr.='</td></tr></table>';
        return $pStr;
    }


    /**
     * 创建一组分页链接
     *
     * @param  int $start
     * @param  int $end
     * @return array
     */
    public function getUrlRange($start, $end)
    {
        $urls = [];

        for ($page = $start; $page <= $end; $page++) {
            $urls[$page] = $this->url($page);
        }

        return $urls;
    }

    
    public function url($value,$key='page')
    { 
        $pageUrl = $_SERVER["QUERY_STRING"];
        parse_str($pageUrl,$arr); 
        $arr[$key]=$value;
        return '?'.http_build_query($arr); 
    }

}